# Replication code for "Following the trail of words: 
# mapping trending topics of graduate research in IR 
# in Brazil (1987-2018)"

############### This code replicates the preprocessing stage before
############### running the STM. Its outcome is the workspace used in
############### the analysis.

## Loading packages

if(require(readxl) == F) {install.packages("readxl");
  require(readxl)}
if(require(tidyr) == F) {install.packages("tidyr");
  require(tidyr)}
if(require(tidytext) == F) {install.packages("tidytext");
  require(tidytext)}
if(require(stm) == F) {install.packages("stm");
  require(stm)}
if(require(readtext) == F) {install.packages("readtext");
  require(readtext)}
if(require(quanteda) == F) {install.packages("quanteda");
  require(quanteda)}
if(require(dplyr) == F) {install.packages("dplyr");
  require(dplyr)}
if(require(ggplot2) == F) {install.packages("ggplot2");
  require(ggplot2)}
if(require(haven) == F) {install.packages("haven");
  require(haven)}
if(require(here) == F) {install.packages("here");
  require(here)}
if(require(lexiconPT) == F) {install.packages("lexiconPT");
  require(lexiconPT)}
if(require(reshape2) == F) {install.packages("reshape2");
  require(reshape2)}
if(require(ptstem) == F) {install.packages("ptstem");
  require(ptstem)}
if(require(stringr) == F) {install.packages("stringr");
  require(stringr)}
if(require(tm) == F) {install.packages("tm");
  require(tm)}

## Loading, preparing and cleaning the database

df <- read_excel("tesesedissertacoes.consolidado.xlsx")
area <- c("RELACOES INTERNACIONAIS","RELAÇÕES INTERNACIONAIS","DIPLOMACIA",
          "RELACÕES INTERNACIONAIS", "Relações Internacionais",
          "RELAÇÕES INTERNACIONAIS (UNESP/UNICAMP/PUC-SP)",
          "INTEGRAÇÃO  LATINO - AMERICANA", 
          "RELAÇÕES INTERNACIONAIS PARA A AMÉRICA DO SUL",
          "RELAÇÕES INTERNACIONAIS: POLÍTICA INTERNACIONAL" ,
          "ESTUDOS ESTRATÉGICOS DA DEFESA E DA SEGURANÇA",
          "RELAÇOES INTERNACIONAIS", "ECONOMIA POLÍTICA INTERNACIONAL", 
          "RELAÇÕES INTERNACIONAIS (UNESP - UNICAMP - PUC-SP)", 
          "Estudos Estratégicos Internacionais","ESTUDOS ESTRATÉGICOS INTERNACIONAIS", 
          "CIÊNCIAS MILITARES", "CIÊNCIAS AEROESPACIAIS", "ESTUDOS MARÍTIMOS",
          "INTEGRAÇÃO CONTEMPORÂNEA DA AMÉRICA LATINA - ICAL",
          "ANÁLISE E GESTÃO DE POLÍTICAS INTERNACIONAIS: RESOLUÇÃO DE CONFLITOS E COOPERAÇÃO PARA O DESENVOLVIMENTO",
          "CIÊNCIA POLÍTICA E RELAÇÕES INTERNACIONAIS", "ESTUDOS DE FRONTEIRA")
df <- df %>% filter(NomePrograma %in% area)
df <- df %>% filter(ResumoTese != "...")
df <- df %>% filter(ResumoTese != "#") 
df <- df %>% filter(ResumoTese != "........")
df <- df %>% filter(ResumoTese != "Resumo não disponível") 
df <- df %>% filter(ResumoTese != "xxxxxx")
df <- df %>% filter(ResumoTese != "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm")
df <- df %>% filter(ResumoTese != "XXXXXXXXXXX")
df <- df %>% filter(ResumoTese != "resumo")
df <- df %>% filter(ResumoTese != "sssss")
df <- df %>% filter(ResumoTese != "Ver Resumo")
df <- df %>% filter(ResumoTese != "VIDE ATA ANEXADA")
df <- df %>% filter(ResumoTese != "VIDE ATA ANEXO")
df <- df %>% filter(ResumoTese != "VIDE ATA")
df <- df %>% filter(ResumoTese != "#")

idm <- df$Idioma
idm <- idm[!duplicated(idm)]
idm
idm <- c("Portugues", "Português", "PORTUGUES", "PORTUGUÊS", "NA")
df <- df %>% filter(Idioma %in% idm)
rm(area, idm)

sgl <- df$SiglaIes
sgl <- sgl[!duplicated(sgl)]
sgl
ST <- df %>% filter(SiglaIes == "PUC/SP" | SiglaIes == "UNESP/MAR" |
                      SiglaIes == "UNICAMP")
df$SiglaIes[df$SiglaIes=="UNESP-MAR"] <- "UNESP/MAR"
df$SiglaIes[df$SiglaIes=="UNESP/MAR"] <- "STD"
df$SiglaIes[df$SiglaIes=="UNICAMP"] <- "STD"
df$SiglaIes[df$SiglaIes=="PUC/SP"] <- "STD"

nme <- df$NomePrograma
nme <- nme[!duplicated(nme)]
nme
rel <- c("RELACOES INTERNACIONAIS", "RELAÇÕES INTERNACIONAIS",
         "RELACÕES INTERNACIONAIS", "Relações Internacionais",
         "RELAÇÕES INTERNACIONAIS (UNESP/UNICAMP/PUC-SP)",
         "RELAÇÕES INTERNACIONAIS: POLÍTICA INTERNACIONAL",
         "RELAÇÕES INTERNACIONAIS (UNESP - UNICAMP - PUC-SP)",
         "RELAÇOES INTERNACIONAIS")
int <- c("INTEGRAÇÃO  LATINO - AMERICANA", "INTEGRAÇÃO CONTEMPORÂNEA DA AMÉRICA LATINA - ICAL")
eei <- c("Estudos Estratégicos Internacionais", "ESTUDOS ESTRATÉGICOS INTERNACIONAIS")
df$NomePrograma[df$NomePrograma %in% rel] <- "RELACOES INTERNACIONAIS"
df$NomePrograma[df$NomePrograma %in% int] <- "INTEGRACAO LATINOAMERICANA"
df$NomePrograma[df$NomePrograma %in% eei] <- "ESTUDOS ESTRATEGICOS"

df$orientador <- toupper(df$Orientador_1)
df$orientador[df$orientador == "ANTONIO AUGUSTO CANCAD TRINDADE"] <- "ANTONIO AUGUSTO CANCADO TRINDADE"
df$orientador[df$orientador == "MARIA DE FATIMA JUNHO ANATASIA"] <- "MARIA DE FATIMA JUNHO ANASTASIA"
df$orientador[df$orientador == "PAULO GILBERTO  FAGUNDES VIZENTINI"] <- "PAULO GILBERTO FAGUNDES VISENTINI"
df$orientador[df$orientador == "PAULO GILBERTO FAGUNDES VIZENTINI"] <- "PAULO GILBERTO FAGUNDES VISENTINI"

df$orientador <- chartr("ÁÉÍÓÚÔÇÃÊÂ", "AEIOUOCAEA", df$orientador)
rm(eei, int, nme, rel, sgl, ST)

## Cleaning the abstracts, removing some punctuation, and 
## stemming words in Portuguese

df$ResumoTese <- tolower(df$ResumoTese)
df$ResumoTese <- gsub("\\.", " ", df$ResumoTese)
df$ResumoTese <- gsub('"', '', df$ResumoTese)
df$ResumoTese <- gsub('“', '', df$ResumoTese)
df$ResumoTese <- gsub('”', '', df$ResumoTese)
df$ResumoTese <- gsub('‘', '', df$ResumoTese)
df$ResumoTese <- gsub('’', '', df$ResumoTese)
df$ResumoTese <- gsub("'", '', df$ResumoTese)
df$ResumoTese <- gsub('â€œ', '', df$ResumoTese)
df$ResumoTese <- gsub('---', '', df$ResumoTese)
df$ResumoTese <- gsub('_', '', df$ResumoTese)
df$ResumoTese <- gsub('-\n', '', df$ResumoTese)
df$ResumoTese <- gsub('\n', ' ', df$ResumoTese)
df$ResumoTese <- gsub('-\t', '', df$ResumoTese)
df$ResumoTese <- gsub('\t', ' ', df$ResumoTese)
df$ResumoTese <- gsub('-', '', df$ResumoTese)

df$ResumoTese <- ptstem(df$ResumoTese, complete=FALSE)

df$ResumoTese <- removePunctuation(df$ResumoTese)
stop <- ptstem(tm::stopwords("pt"))
df$ResumoTese <- removeWords(df$ResumoTese, stop)
df$ResumoTese <- removeNumbers(df$ResumoTese)

## Merging compound words which are too common within the
## Brazilian IR scholarship

df$ResumoTese <- gsub("direit human", "direitoshumanos", df$ResumoTese)
df$ResumoTese <- gsub("fernand henriqu card", "fhc", df$ResumoTese)
df$ResumoTese <- gsub("fern henriqu card", "fhc", df$ResumoTese)
df$ResumoTese <- gsub("lul  silv", "lul", df$ResumoTese)
df$ResumoTese <- gsub("luiz inaci lul", "lul", df$ResumoTese)

df$ResumoTese <- gsub("guerr fri", "guerrafria", df$ResumoTese)
df$ResumoTese <- gsub("integr region", "integracaoregional", df$ResumoTese)

df$ResumoTese <- gsub("polit exterior", "politicaexterna", df$ResumoTese)
df$ResumoTese <- gsub("polit extern", "politicaexterna", df$ResumoTese)
df$ResumoTese <- gsub("politicaexterna brasil", "peb", df$ResumoTese)

df$ResumoTese <- gsub("rio branc", "riobranco", df$ResumoTese)

## Reducing the database, eliminating unnecessary variables
df <- df %>% select(AnoBase, Regiao, Uf, SiglaIes, NomePrograma, Autor, TituloTese,
                    Nivel, DataDefesa, PalavrasChave, Idioma, ResumoTese, LinhaPesquisa, orientador)


## Then, we evaluate the document-frequency statistics to 
## Determinate the thresholds for the next steps

eval <- dfm(corpus(df$ResumoTese))
eval <- as.data.frame(docfreq(eval))
eval$words <- row.names(eval)
eval <- eval %>% filter(`docfreq(eval)` > 20)

## Creating a vector with words that are too common but do not
## help us identifying topics - complementary stopwords

stop2 <- c('ade',"apen", "argumentas", "ate", "dev", "doi", "mai", "nao", "nest", 
           "pod", "qualqu", 'sao', "ter", "ser", "zao", "buscous", "ist",
           
           "capitul", "abord", "pesquis", "estud", "literat", "prim",
           "prime", "segund", "terc","quart", "tre", "dess",
           "identif", "tes", "metodolog", "divid", "academ",
           "hipot", "acerc", "discut", "context", "contextu", 
           "introduc", "introduz",
           "autor", "dissertaca", "compreend", "compreens", "utiliz", "bem",
           "apres", "empir", "brev",
           "model", "vari", "explic", "hipotes", "result", "efeit", "avali",
           "respond", "compar", "test", "hav", "aind", "tant",
           "sobretud", "artig", "mestr", "palavraschav", "resum",
           "pal", "palavr", "entend", "ess", "est", "pen",
           "apres", "princip", "quest", "debat", "obr", "aprofund",
           "aplic", "element", "algum", "noss", "text",
           "aspect", "busc", "fat", "problem", "tal", "pal", "conceit",
           "reflex", "propost", "propo", "pen", "realiz", "apen",
           "iss", "diss", "trata", "atraves", "sob", "prism",
           "argument", "cuj", "tratas", "tambem", "aqu",
           "sej", "dest", "porqu", "del", "send", "poi", "fim",
           "demonstr", "cad", "revel", "enfas", "mei", "is",
           "poi", 'ape', "send", "consid", "apont", "mostr",
           "ness", "nest", "ambos", "ambas", "apresent", "apresentas",
           'identif', 'identific', 
           
           "anal", "analil", "log",
           "via", "paul", "aca", "acab", 'ent', 'daquel',
           'outr', "nel", 'robert', 'univers', 'conform',
           'coer', 'coes', 'descr', 'pressupost', 'ressalt',
           'oferec', 'luz', 'mesm', 'perspec', 'alem', 'outr',
           'trac', 'enfoqu', 'enfoc', 'pergunt',
           'ensin', 'superi', 'rel', 'feder', 'projet',
           'tend', 'program', 'exist', 'observ',
           'apo', 'consid', 'exam', 'assim',
           'buscas', 'possu', 'pol', 'bibliograf',
           'dad', 'escolh', 'revi', 'relaco',
           'identif', 'faz','fazs', 'identific',
           'quant', 'especif', 'quantit',
           'qualit', 'qualqu', 'objetiv', 'metodolog',
           'objet', 'dentr', 'metod', 'diz', 'tao',
           'resid', 'classific', 'feder', 'foc',
           'enfoc', 'junt', 'apes', 'apen', 'daquel',
           'fic', 'tinh', 'dentr', 'fenomen', 'var',
           'diz', 'feit', 'trac', 'faz',
           
           'sid', 'descr', 'descri', 'descrit',
           'descrev', 'discuss', 'discutes', 'justif', 'mao',
           'quatr', 'iii', 'vem', 'dua', 'conclus', 'conclu',
           'consluis', 'analisas', 'consid', 'consider',
           'aval', 'avali', 'tod', 'exempl', 'tod', 'desd')
stop3 <- tm::stopwords("en") %>% iconv(from = "UTF-8", to = "ASCII//TRANSLIT")


## We will now finish preprocessing the data, removing stopwords from the
## text corpus. We also eliminate words that appear in less than 1% and
## more than 99% of the abstracts, in order to avoid too common and too
## rare words.

processed <- textProcessor(df$ResumoTese, metadata=df, language="pt",
                           verbose=TRUE, customstopwords=c(stop, stop2, stop3))

out <- prepDocuments(processed$documents, processed$vocab, processed$meta,
                     lower.thresh = 25, upper.thresh = 806)

rm(eval, processed, stop, stop2, stop3)

## We now save the workspace finish using this script. We will now use
## the "STM_ftw.R" script.
